package mashibing.class2;


import org.junit.Test;

/**
 * 认识异或运算
 *
 * @author yujiafan
 * @version 1.0.0
 * @create 2023-03-07
 */
public class Class2_2_EvenTimesOddTimes {

    /**
     * 一个数组中有一种数出现了奇数次，其他数都出现了偶数次，怎么找到并打印这种数
     */
    @Test
    public void test1() {
        int[] arr = {11, 11, 5, 66, 66, 2, 2, 1, 1};
        int value = 0;
        for (int i = 0; i < arr.length; i++) {
            value ^= arr[i];
        }
        System.out.println(value);
    }

    /**
     * 怎么把一个int类型的数，提取出最右侧的1来
     */
    @Test
    public void test2() {
        int a = 10;     // 1010
        int result = a & (~a + 1);
        System.out.println(result);
    }

    /**
     * 一个数组中有两种数出现了奇数次，其他数都出现了偶数次，怎么找到并打印这两种数
     * 1、xor=a^b;
     * 2、获取xor最右边为1划分两数
     * 3、xor'=a,最后得出b
     */
    @Test
    public void test3() {
        int[] arr = {11, 11, 5, 66, 66, 2, 2, 1, 1, 8};
        int xor = 0;
        for (int i = 0; i < arr.length; i++) {
            xor ^= arr[i];      // a^b
        }
        int mostRightOne = xor & (-xor);
        int xor1 = 0;
        for (int i = 0; i < arr.length; i++) {
            if ((mostRightOne & arr[i]) != 0) {
                xor1 ^= arr[i];     // a
            }
        }
        System.out.println(xor1 + "," + (xor1 ^ xor));
    }
}
